package com.wdzl;

import com.wdzl.LoginJFrame;
import com.wdzl.User;

import javax.swing.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;

public class RegisterJFrame extends JFrame implements MouseListener {
    ArrayList<User> allUsers;
    //用户的集合
    JTextField username = new JTextField();
    JTextField password = new JTextField();
    JTextField rePassword = new JTextField();
    //    用户名，密码，再次输入密码的文本框
    JButton submit = new JButton();
    JButton reset = new JButton();
// 注册按钮和重置按钮

    public RegisterJFrame(ArrayList<User> allUsers){
        //坚持先初始化窗口再初始化组件
        this.allUsers = allUsers;
        initFrame();
        initView();
        setVisible(true);
    }

    @Override
    public void mouseClicked(MouseEvent e) {
//        点击注册按钮

        if(e.getSource() == submit){
//            1、检查文本框是否为空
            if (username.getText().length() == 0 || password.getText().length() == 0 || rePassword.getText().length() == 0){
                    showDialog("用户名和密码不能为空");
                return;
            }
//            2、检查两次的密码是否一致
            if (!password.getText().equals(rePassword.getText())){
                    showDialog("两次密码输入不一致");
                return;
            }
//            3、判断格式是否合规
            if(!username.getText().matches("[a-zA-z0-9]{4,16}")){
showDialog("用户名不合规范，长度在4-16，无特殊字符");
                return;
            }
            if (!password.getText().matches("^(?=.*[a-z])(?=.*[0-9]).{6,16}$")){
                showDialog("密码不合规，至少包含一个小写字母，一个数字，长度6-16");
                return;
            }
//            4、判断用户名是否重复
            if(containsUsername(username.getText())){
                showDialog("用户名已存在，请重新输入");
                return;
            }
//            以上检查均通过，则添加这个用户和密码
            User user = new User(username.getText(),password.getText());
            allUsers.add(user);
            try (BufferedWriter bw = new BufferedWriter(new FileWriter("userinfo.txt", true))){
                bw.write("username="+username.getText()+"&password="+password.getText());
                bw.newLine();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
//            提示
            showDialog("注册成功");
//            关闭注册界面
            setVisible(false);
//            刷新登录页面
            try {
                new LoginJFrame();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }else if (e.getSource() == reset){
//            点击重置按钮
//            清空三个输入框
            username.setText("");
            password.setText("");
            rePassword.setText("");
        }
    }
//    ^ ：匹配字符串的开始位置。
//    ？= 表示正向预查，至少包含一个[]中的字符
//            (?=.*[a-z]) ：正向预查，确保字符串中至少有一个小写字母。其中.* 表示任意字符出现 0 次或多次，[a-z] 表示匹配一个小写字母 。
//            (?=.*[0-9]) ：正向预查，确保字符串中至少有一个数字。
//            .{6,16} ：匹配任意字符，长度至少为 6 位，最多为 16 位。
//    $ ：匹配字符串的结束位置。

    @Override
    public void mousePressed(MouseEvent e) {
if (e.getSource()==submit){
    submit.setIcon(new ImageIcon("images/register/注册按下.png"));
}else if(e.getSource()==reset){
    reset.setIcon(new ImageIcon("images/register/重置按下.png"));
}
    }

    @Override
    public void mouseReleased(MouseEvent e) {
if (e.getSource()==submit){
    submit.setIcon(new ImageIcon("images/register/注册按钮.png"));
}else if (e.getSource()==reset){
    reset.setIcon(new ImageIcon("images/register/重置按钮.png"));
}
    }

    @Override
    public void mouseEntered(MouseEvent e) {

    }

    @Override
    public void mouseExited(MouseEvent e) {

    }
//    设置面板内容
 private void initView(){
     //添加注册用户名的文本
     JLabel usernameText = new JLabel(new ImageIcon("images/register/注册用户名.png"));
     usernameText.setBounds(85, 135, 80, 20);

     //添加注册用户名的输入框大小
     username.setBounds(195, 134, 200, 30);

     //添加注册密码的文本
     JLabel passwordText = new JLabel(new ImageIcon("images/register/注册密码.png"));
     passwordText.setBounds(97, 193, 70, 20);

     //添加密码输入框
     password.setBounds(195, 195, 200, 30);

     //添加再次输入密码的文本
     JLabel rePasswordText = new JLabel(new ImageIcon("images/register/再次输入密码.png"));
     rePasswordText.setBounds(64, 255, 95, 20);

     //添加再次输入密码的输入框
     rePassword.setBounds(195, 255, 200, 30);

     //注册的按钮
     submit.setIcon(new ImageIcon("images/register/注册按钮.png"));
     submit.setBounds(123, 310, 128, 47);
     submit.setBorderPainted(false);
//     边框不绘制
     submit.setContentAreaFilled(false);
//     内容区域不填充
//     以上可以实现纯图片的按钮
     submit.addMouseListener(this);

     //重置的按钮
     reset.setIcon(new ImageIcon("images/register/重置按钮.png"));
     reset.setBounds(256, 310, 128, 47);
     reset.setBorderPainted(false);
     reset.setContentAreaFilled(false);
     reset.addMouseListener(this);

     //背景图片
     JLabel background = new JLabel(new ImageIcon("images/Background/background.png"));
     background.setBounds(0, 0, 470, 390);
     getContentPane().add(usernameText);
//     这两种添加方式都可以
//     getContentPane()用来获取内容面板
     add(passwordText);
     add(rePasswordText);
     add(username);
     add(password);
     add(rePassword);
     add(submit);
     add(reset);
     add(background);
 }
//设置框架
    private void initFrame() {
        //设置宽高
        setSize(488, 430);
        //设置标题
        setTitle("拼图游戏 V1.0注册");
        //取消内部默认布局，改用绝对定位
        setLayout(null);
        //设置关闭模式
        setDefaultCloseOperation(3);
        //设置居中
        setLocationRelativeTo(null);
        //设置置顶
        setAlwaysOnTop(true);
    }
//    创建弹窗对象
     JDialog jDialog = new JDialog();
//    弹窗方法
    public void showDialog(String content){
//        传入显示的内容
        if (!jDialog.isVisible()){
//            逻辑 如果弹窗没有显示，则清空弹窗内的内容
            jDialog.getContentPane().removeAll();
//          新建一个标签，来显示对应的内容
            JLabel jLabel = new JLabel(content);
            jLabel.setBounds(0,0,300,200);
            jDialog.add(jLabel);
            jDialog.setSize(300,200);
            jDialog.setAlwaysOnTop(true);
            jDialog.setLocationRelativeTo(null);
            jDialog.setModal(true);
//            设置为模态对话框（阻塞父窗口操作）
            jDialog.setVisible(true);
        }
    }
//    判断用户名是否重复
    public boolean containsUsername(String username){
        for (User u: allUsers){
            if (u.getUsername().equals(username)){
                return true;
            }
        }
        return false;
    }
}
